package liuch.threadPool;

import java.util.concurrent.*;

/**
 * 〈一句话功能简述〉通过callable,future,futureTask获取线程执行的结果<br>
 * callable接口回调函数
 *      future是一个接口，代表可以取消的任务，并可以获的任务的执行结果
 *      futureTask是一个实现了future、runable两个接口的类
 *          实现runnable接口，说明可以把FutureTask实例传入到Thread中，在一个新的线程中执行。
 *          实现Future接口，说明可以从FutureTask中通过get取到任务的返回结果，也可以取消任务执行（通过interreput中断）
 * 〈功能详细描述〉
 *
 * @author 17101651 on 2018/3/7.
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class CallableDemoTest {

    public static void main(String[] args) {
        futureTask();
    }

    // 执行futureTask + Callable
    static void futureTask() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        CallableDemo callableDemo = new CallableDemo();
        FutureTask<Integer> futureTask = new FutureTask<Integer>(callableDemo);
        executorService.submit(futureTask);
        executorService.shutdown();
        try {
            System.out.println("主线程开始执行其他任务");
            Thread.sleep(3000);
            System.out.println("主线程执行完其他任务");
            if (futureTask.get() != null) {
                System.out.println("futureTask.get()-->" + futureTask.get());
            } else {
                System.out.println("futureTask.get()未获取到结果");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("主线程在执行完成");
    }

    // 执行没有Callable +  Future
    static void future() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        CallableDemo callableDemo = new CallableDemo();
        Future<Integer> future = executorService.submit(callableDemo);
        executorService.shutdown();
        try {
            System.out.println("主线程开始执行其他任务");
            Thread.sleep(3000);
            System.out.println("主线程执行完其他任务");
            if (future.get() != null) {
                System.out.println("future.get()-->" + future.get());
            } else {
                System.out.println("future.get()未获取到结果");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("主线程在执行完成");
    }

    /**
     * Callable接口实例
     */
    static class CallableDemo implements Callable<Integer> {

        private int num;

        @Override
        public Integer call() throws Exception {
            System.out.println("Callable子线程开始计算...");
            Thread.sleep(2000);
            for (int i = 0; i < 5000; i++) {
                num++;
            }
            System.out.println("Callable子线程计算结束!");
            return num;
        }
    }
}
